package Map;

import java.util.ArrayList;

public class ZoneFactory {
	public static enum terrainId {
		TERRE, MONTAGNE, EAU, LAVE, FORET;
	}

	// createZoneRect construit de façon récursive une zone et ses sous-zone.
	// l'appel initial de createZoneRect est fait dans le constructeur de map
	/**
	 * @param largeur
	 * @param hauteur
	 * @return une zone
	 */
	public static Zone createZoneRect(int largeur, int hauteur) {

		int sous_largeur = ((int) (largeur / (2 * BlocBase.DIMENSION)))
				* BlocBase.DIMENSION;
		int sous_hauteur = ((int) (hauteur / (2 * BlocBase.DIMENSION)))
				* BlocBase.DIMENSION;
		Zone sous_zone1;
		Zone sous_zone2;
		Zone sous_zone3;
		Zone sous_zone4;
		ArrayList<Zone> sous_zones = new ArrayList<Zone>();

		if (largeur == BlocBase.DIMENSION && hauteur == BlocBase.DIMENSION) {
			return BlocBaseFactory.CreateBlocBase();
		} else if (largeur == BlocBase.DIMENSION) {
			sous_zone1 = createZoneRect(sous_largeur, sous_hauteur);
			sous_zone3 = createZoneRect(sous_largeur, (hauteur - sous_hauteur));
			sous_zones.add(sous_zone1);
			sous_zones.add(sous_zone3);
		} else if (hauteur == BlocBase.DIMENSION) {
			sous_zone1 = createZoneRect(sous_largeur, sous_hauteur);
			sous_zone2 = createZoneRect((largeur - sous_largeur), sous_hauteur);
			sous_zones.add(sous_zone1);
			sous_zones.add(sous_zone2);
		} else {
			sous_zone1 = createZoneRect(sous_largeur, sous_hauteur);
			sous_zone2 = createZoneRect((largeur - sous_largeur), sous_hauteur);
			sous_zone3 = createZoneRect(sous_largeur, (hauteur - sous_hauteur));
			sous_zone4 = createZoneRect((largeur - sous_largeur),
					(hauteur - sous_hauteur));
			sous_zones.add(sous_zone1);
			sous_zones.add(sous_zone2);
			sous_zones.add(sous_zone3);
			sous_zones.add(sous_zone4);
		}
		return new ZoneImpl(largeur, hauteur, sous_zones);
	}

	// Les 2 méthodes suivantes pourront probablement être effacées.
	/**
	 * @param pts
	 * @param id
	 * @return une zone
	 */
	// public static Zone createZone(ArrayList<Point> pts, terrainId id) {
	// return new ZoneImpl(1, 1, null); // À faire
	// }

	/**
	 * @param zones
	 * @return une zone
	 */
	// public static Zone createZone(ArrayList<Zone> zones) {
	// return new ZoneImpl(1, 1, null); // À faire
	// }

	// private Zone zoneRandom() {
	//
	// }
}
